////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011-2012 www.iflytek.com. All Rights Reserved.
//  This software for customer relationship management system, developed by Iflytek_ZY team.
//  Software code and design for the team, copy rights reserved.
////////////////////////////////////////////////////////////////////////////////

package com.iflytek.ci.qams.service;

import com.iflytek.ci.cpms.domain.Milestone;
import com.iflytek.ci.cpms.domain.Project;
import com.iflytek.ci.cums.domain.Account;
import com.iflytek.ci.main.domain.Attachment;
import com.iflytek.ci.qams.domain.Issue;
import com.iflytek.ci.qams.domain.IssueInformation;
import com.iflytek.ci.qams.domain.SelectCondition;
import com.iflytek.framework.pagination.PaginationCriteria;
import com.iflytek.framework.pagination.PaginationResult;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 问题操作 服务接口.
 * </p>
 * 
 * @author poplar.yfyang
 * @version 1.0 2012-11-03 6:52 PM
 * @since JDK 1.5
 */
public interface IssueService {

	/**
	 * 增加一个问题反馈
	 * 
	 * @param issue
	 *            问题信息
	 * @param project_id
	 *            项目id
	 * @return 执行结果（boolean型）
	 */
	boolean create_project_issue(final Issue issue, long project_id);

	/**
	 * 分页得到问题信息列表
	 * 
	 * @param criteria
	 *            分页信息
	 * @return 问题分页列表
	 */
	PaginationResult<Issue> get_all_issues(PaginationCriteria criteria);

	/**
	 * 删除一个或多个问题信息
	 * 
	 * @param id
	 *            问题id
	 */
	void remove_issue(long[] id);

	/**
	 * 创建一个新的问题
	 * 
	 * @param issue
	 *            问题信息
	 * @param attachments
	 *            附件名称
	 * @return 是否创建成功
	 */
	boolean create_project_issue_attachments(Issue issue,
			List<Attachment> attachments);

	/**
	 * 根据问题id得到该问题的详细信息
	 * 
	 * @param issue_id
	 *            问题id
	 * @return 问题详细信息
	 */
	Issue getFromId(long issue_id);

	/**
	 * 根据项目id查找相关的所有问题的分页信息
	 * 
	 * @param criteria
	 *            分页信息
	 * @param p_id
	 *            项目id
	 * @return 问题分页
	 */
	PaginationResult<Issue> get_byp_id(PaginationCriteria criteria, long p_id);

	/**
	 * 根据问题号或者问题详细信息
	 * 
	 * @param issue_key
	 *            问题号
	 * @return 问题信息
	 */
	IssueInformation from_key(String issue_key);

	/**
	 * 根据查询条件得到问题
	 * 
	 * @param params
	 *            map类型的查询条件
	 * @return paging information
	 */
	PaginationResult<Issue> find_issues(PaginationCriteria criteria,
			Map<String, Object> params);

	/**
	 * 更新回复的数量
	 * 
	 * @param size
	 *            回复数量
	 * @param id
	 *            回复ID
	 */
	void comment_size(int size, long id);

	/**
	 * 根据项目id得到第一个问题
	 * 
	 * @param pid
	 *            项目id
	 * @return 问题信息
	 */
	Issue getTop(long pid);

	/**
	 * 指派时对问题进行更新
	 * 
	 * @param ids
	 *            多个问题的id
	 * @param uname
	 *            被指派者的login
	 */
	void update_assignee(String[] ids, String uname);

	/**
	 * 为一个或者多个问题设置标签
	 * 
	 * @param issue_ids
	 *            多个问题id
	 * @param label
	 *            标签类型
	 * @return 设置影响的行数
	 */
	int update_issue_label(String[] issue_ids, int label);

	/**
	 * 得到多个问题关联的用户
	 * 
	 * @param ids
	 *            多个问题id
	 * @return 用户列表
	 */
	List<Account> uinfo(String ids);

	/**
	 * 给指定的问题设置label
	 * 
	 * @param id
	 *            问题id
	 * @param label
	 *            问题label
	 */
	void appoint_label(String id, int label);

	/**
	 * 更新issue信息（暂时用于更新updated字段）
	 * 
	 * @param issue
	 *            问题信息
	 */
	public void update_issue(Issue issue);

	/**
	 * 根据用户的login得到该用户需要处理的问题数量
	 * 
	 * @param login
	 *            用户的login
	 * @return 问题数量
	 */
	int get_count_todo(String login);

	/**
	 * 为多个问题设置优先级
	 * 
	 * @param ids
	 *            多个问题id
	 * @param priopity
	 *            优先级别
	 */
	void set_priopity(String[] ids, int priopity);

	/**
	 * 根据用户login得到与之相关的问题分页
	 * 
	 * @param criteria
	 *            分页信息
	 * @param login
	 *            用户login
	 * @param name
	 * @return
	 */
	PaginationResult<Issue> page_getIssueByLogin(PaginationCriteria criteria,
			String login, String name);

	/**
	 * 得到某个leader相关的问题分页
	 * 
	 * @param criteria
	 *            分页参数
	 * @param leader
	 *            用户的login字段
	 * @param name
	 *            用户的name
	 * @return 分页的isue信息
	 */
	PaginationResult<Issue> page_getIssueByLeader(PaginationCriteria criteria,
			String leader, String name);

	/**
	 * 得到某个用户报告的问题
	 * 
	 * @param login
	 *            用户login
	 * @return 问题数量
	 */
	int get_number_reporte(String login);

	/**
	 * 根据某个用户 得到根据优先级排序的后 的 前10个问题
	 * 
	 * @param login
	 *            用户login
	 * @return 问题列表
	 */
	List<Issue> issue_assignee_order(String login);

	/**
	 * 得到某个用户报告的并且按照优先级、提出时间排序的 前10个问题
	 * 
	 * @param login
	 *            用户login
	 * @return 问题列表
	 */
	List<Issue> issue_reporter_order(String login);

	/**
	 * 获取指派给某用户的反馈信息，通过反馈信息状态分类
	 * 
	 * @param login
	 *            用户的登录信息
	 * @param status
	 *            反馈信息状态
	 * @param criteria
	 *            分页信息
	 * @return issue 分页的反馈信息列表
	 */
	PaginationResult<Issue> page_assignee_status(String login, String status,
			PaginationCriteria criteria);

	/**
	 * 设置反馈信息为fixed状态 issuestatus=2
	 * 
	 * @param ids
	 *            多个issue的id
	 */
	void set_issue_fixed(String[] ids);

	/**
	 * 根据用户身份分页获取fixed的issue信息
	 * 
	 * @param criteria
	 *            分页参数
	 * @return 分页结果
	 */
	PaginationResult<Issue> page_issue_fixed(PaginationCriteria criteria);

	/**
	 * 获取当前登陆人提出的待处理反馈信息
	 * 
	 * @param criteria
	 *            分页参数
	 * @param login
	 *            用户登录名
	 * @return
	 */
	PaginationResult<Issue> page_reporte_status(PaginationCriteria criteria,
			String login);

	/**
	 * 关闭或重新打开反馈信息
	 * 
	 * @param ids
	 *            多个反馈信息的id
	 * @param status
	 *            反馈信息状态，1为关闭，0为重新打开
	 */
	void close_open_issue(String[] ids, int status);

	/**
	 * 根据 milestone得到与这个milestone相关的反馈数量 （可以加入一个过滤条件，可以为空）
	 * 
	 * @param milestone_id
	 *            里程碑id
	 * @param name
	 *            过滤条件名字 (要与数据库字段对应)
	 * @param value
	 *            对应过滤条件值
	 * @return 反馈数量
	 */
	int issue_number_with_milestone_param(long milestone_id, String name,
			String value);

	/**
	 * 根据 milestone得到与这个milestone相关的反馈列表
	 * 
	 * @param milestone_id
	 *            里程碑id
	 * @return 问题列表
	 */
	List<Issue> issues_with_milestone(long milestone_id);

	/**
	 * 批量设置反馈信息所属里程碑
	 * 
	 * @param issue_ids
	 * @param milestone_id
	 */
	void update_issue_milestone(String[] issue_ids, String milestone_id);

	/**
	 * 获取某个项目的某种类型的反馈信息（根据状态分类）数量
	 * 
	 * @param p_id
	 *            项目id
	 * @return 该里程碑的各类型反馈信息的打开和关闭数量构成的列表
	 */
	List<Integer> count_with_project_status_type(long p_id);

	/**
	 * 获取某里程碑的反馈信息数量
	 * 
	 * @param milestone_id
	 *            里程碑的id
	 * @return 该里程碑的打开和关闭反馈的数量构成的列表
	 */
	List<Integer> count_with_milestone_status(long milestone_id);

	/**
	 * 获取某一个里程碑的反馈信息，并分页显示在界面上
	 * 
	 * @param criteria
	 *            分页信息
	 * @param milestone
	 *            里程碑（需要的是id,project和owner属性）
	 * @param label
	 *            前台传递的标签，有“todo”，“done”，“all”，“my_issue”
	 * @return 分页的issue列表
	 */
	PaginationResult<Issue> page_issue_milestone_list(
			PaginationCriteria criteria, Milestone milestone, String label);

	/**
	 * 获取某项目的最新10条反馈信息，按优先级和创建时间排列
	 * 
	 * @param p_id
	 *            项目id
	 * @return 反馈列表，不分页
	 */
	List<Issue> get_issue_project_order(long p_id);

	/**
	 * 根据项目信息获取相关的所有反馈信息，并做分页处理
	 * 
	 * @param criteria
	 *            分页信息
	 * @param project
	 *            项目信息
	 * @param label
	 *            前台传过来的标签，有all，todo,done,my_issue四个值
	 * @return
	 */
	PaginationResult<Issue> page_issue_project_list(
			PaginationCriteria criteria, Project project, String label);

	/**
	 * 根据项目的id获取该项目所有里程碑的反馈信息数量统计（按照状态分类）
	 * 
	 * @param pid
	 *            项目id
	 * @return map类型的列表，包含信息为（close，count）和（not_close，count）
	 */
	List<Integer> count_every_milestone_by_pid(String pid);

	/**
	 * 通过多重条件查询相关反馈信息
	 * 
	 * @param conditions
	 *            查询条件组成的dto
	 * @return
	 */
	PaginationResult<Issue> page_issue_by_conditions(SelectCondition conditions);

	/**
	 * 根据当前用户登录名查询该用户提出的相关反馈信息
	 * 
	 * @param project_id
	 *            项目id
	 * @param milestone_id
	 *            里程碑id
	 * @param criteria
	 *            分页信息
	 * @return
	 */
	PaginationResult<Issue> page_by_pro_mile(long project_id,
			long milestone_id, PaginationCriteria criteria);
}
